#ifndef PROCESSOS
#define PROCESSOS
#include <stdio.h>
#include <stdlib.h>

typedef struct array{
	char *comando;       //Armazena um dos 7 comandos possiveis.
	char *instrucao; 	 //Instrução. Normalmente um inteiro para se somar à variavel. No caso do  
} instrucoes;		     //process_manager, pode ser uma chamada para outro arquivo.	

typedef struct processo_simulado{
	/*
		De acordo com a descrição do tp, todo processo simulado
		consiste nessa estrutura.
	*/
	
	int id;					    //id do processo, identifica esse processo na tabela de processos.
	int pid;					//Guarda o id do processo pai.
	int variavel_local;		    //variavel local, onde as operações são feitas.
	int contador_programa;      //Iinforma para um programa onde ele se encontra.
	int tamanho;				//Guarda a quantidade de comandos de um processo.				
	int tempo_usado;			//Tempo em que o processo permaneceu na cpu.
	instrucoes *programa;		//Vetor que armazena as instruçõs do processo.
	int estado;				    //Flag que informa o estado do processo. 1-> pronto; 2-> block; 3-> finalizado.				
	int prioridade;				//Flag que informa a prioridade do processo. de 1 a 10. Atribuida aleatoriamente.
} processo_simulado;

/*Ponteiro para um processo simulado*/
typedef struct processo_simulado *apontador;


processo_simulado *cpu;
int id_processos;
int qtd_processos_criados;
int qtd_processos_prontos;
int qtd_processos_bloqueados;
int contador_global;
int tipo_escalonador;

/*Variaveis globais*/
apontador *tabela_processos;
apontador *processos_prontos;
apontador *processos_bloqueados;

/*Carrega as instrucoes do arquivo para o processo*/
processo_simulado *iniciar_processo(char *nome_aquivo, int pid);

/*Executa a instrução atual de um processo que estiver na cpu*/
void executa_instrucao();
void bloquear_processo();
void desbloquear_processo();
void imprime_instrucoes();
void encerrar_processo();
void processo_reporter();
void escalonar();

/* funções que serão usadas pelo qsort() */
int comparaTempo(processo_simulado *p1, processo_simulado *p2); 
int comparaPrioridade(processo_simulado *p1, processo_simulado *p2);


//gera um número aleatório entre 0 e qtd_processos_prontos
int escolherAleatorio();
#endif
